/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.gestformwww.controlador;

import com.ipartek.formacion.gestformwww.modelo.ModeloCandidato;
import com.ipartek.formacion.gestformwww.modelo.ModeloConvocatoria;
import com.ipartek.formacion.gestformwww.modelo.beans.Candidato;
import com.ipartek.formacion.gestformwww.modelo.beans.Convocatoria;
import com.ipartek.formacion.gestformwww.modelo.beans.Empresa;
import com.ipartek.formacion.gestformwww.modelo.beans.Estado;
import com.ipartek.formacion.gestformwww.modelo.beans.FiltroContacto;
import com.ipartek.formacion.gestformwww.modelo.beans.FiltroCorreo;
import com.ipartek.formacion.gestformwww.modelo.beans.Procedencia;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *Clase encargada de mostrar el candidato seleccionado
 * @author Ekaitz y Eneko - JonG & ErikF (modif)
 */
public class VisualizarCandidatoAccion implements Accion {

    private final String visualizarcandidato = "visualizar-candidato-accion";
    private final String listarcandidatos = "listar-candidatos-accion";
    private final String visualizarlistacontactos = "visualizar-lista-contactos-accion";
    private final String visualizarhistorialSMS = "visualizar-historialsms-accion";
    private final String visualizarhistorialEmails = "visualizar-historialemailscandidato-accion";
    private final String visualizarhistorialConvocatorias = "visualizar-historialconvocatoriascandidato-accion";
    ResourceBundle bundle;
    /**
     * Carga los datos del candidato seleccionado, si existe el usuario, el candidato y la convocatoria te muestra el usuario, si hay algun error te devuelve a la lista.
     * @param servlet
     * @param request
     * @param response
     * @return Devuelve el router que llevara el nombre de la jsp que corresponda
     */
    public AccionRouter ejecuta(HttpServlet servlet, HttpServletRequest request, HttpServletResponse response) {
        HttpSession sesion;
        AccionServlet as = (AccionServlet) servlet;
        sesion = request.getSession();
        AccionRouter router;
        String path = null;
        ModeloConvocatoria mconvocatoria = (ModeloConvocatoria) servlet.getServletContext().getAttribute("ModeloConvocatoria");
        ModeloCandidato modelo = (ModeloCandidato) servlet.getServletContext().getAttribute("ModeloCandidato");
        Candidato candidatoMostrar = new Candidato();
        ArrayList<Estado> estados = new ArrayList<Estado>();
        ArrayList<Empresa> empresas = new ArrayList<Empresa>();
        ArrayList<Procedencia> procedencias = new ArrayList<Procedencia>();


        Integer idCandidato = -1;
        Integer idConvocatoria = -1;

        if (sesion.getAttribute("usuario") == null) {
            router = new AccionRouter("inicio", false);
        } else {
            router = new AccionRouter("principal");

            if ((Verificador.numeroValido(request.getParameter("canId"))) && (Verificador.numeroValido(request.getParameter("idCon")))) {
                //Si ha entrado aquí el canId  y el idConvocatoria es correcto 
          
                if (request.getAttribute("canId") != null) {
                    idCandidato= (Integer) request.getAttribute("canId");
                } else {
                    idCandidato = Integer.parseInt(request.getParameter("canId"));
                }
                if (request.getAttribute("idCon") != null) {
                    idConvocatoria = Integer.parseInt((String) request.getAttribute("idCon"));
                } else {
                    idConvocatoria = Integer.parseInt(request.getParameter("idCon"));
                }
                try {
                    //  visualizo el candidato con sus ids respectivas
                    candidatoMostrar = modelo.visualizarCandidato(idCandidato, idConvocatoria);
                } catch (GestorFormacionExcepcion ex) {
                    sesion.setAttribute("excepciones", ex.getMessage());
                    Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                }
                //  si mostrar no da errores
                if (candidatoMostrar != null) {
                    try {
                        Convocatoria convocatoria = null;
                        try {
                            convocatoria = mconvocatoria.visualizarConvocatoria(idConvocatoria);
                            estados = modelo.listaEstados();
                            empresas = modelo.listaEmpresas();
                            procedencias = modelo.listaProcedencias();
                        } catch (GestorFormacionExcepcion ex) {
                            sesion.setAttribute("excepciones", ex.getMessage());
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        }

                        request.setAttribute("nombreConvocatoria", convocatoria.getConNom());// Si no hay conexion da error en esta linea
                        request.setAttribute("visualizacandidato", candidatoMostrar);
                        request.setAttribute("contenido", "visualiza-candidato");
                        request.setAttribute("listaEstados", estados);
                        request.setAttribute("listaEmpresas", empresas);
                        request.setAttribute("listaProcedencias", procedencias);

                        //path = "principal";

                        int pestana = 0;
                            if (Verificador.numeroValido(request.getParameter("idPestanaCandidato"))) {
                                pestana = Integer.parseInt(request.getParameter("idPestanaCandidato"));
                            }

                            switch (pestana) {
                                default:
                                    path = visualizarlistacontactos;
                                    bundle = (ResourceBundle) servlet.getServletContext().getAttribute("acciones-mapeo");
                                    FiltroContacto filtroC = new FiltroContacto(bundle);

                                    filtroC.setCanId(Integer.parseInt(request.getParameter("canId")));
                                    filtroC.setConId(Integer.parseInt(request.getParameter("idCon")));
                                    filtroC.setColumnaFiltrar(request.getParameter("filtroColumnaCont"));
                                    filtroC.setOrden(request.getParameter("filtroOrdenCont"));
                                    sesion.setAttribute("filtrocontacto", filtroC);
                                    router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                                    break;
                                case 2:
                                    path = visualizarhistorialSMS;
                                    router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                                    break;
                                case 3:
                                    path = visualizarhistorialEmails;
                                    bundle = (ResourceBundle) servlet.getServletContext().getAttribute("acciones-mapeo");
                                    FiltroCorreo filtroCorreo = new FiltroCorreo(bundle);

                                    filtroCorreo.setCanId(Integer.parseInt(request.getParameter("canId")));
                                    filtroCorreo.setConId(Integer.parseInt(request.getParameter("idCon")));
                                    filtroCorreo.setColumnafiltrar(request.getParameter("filtroColumnaCont"));
                                    filtroCorreo.setOrden(request.getParameter("filtroOrdenCont"));
                                    sesion.setAttribute("filtrocorreo", filtroCorreo);
                                    router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                                    break;
                                case 4:
                                    path=visualizarhistorialConvocatorias;
                                    router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                                    break;
                            }

                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InstantiationException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalAccessException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        }
                }else{
                    if(request.getParameter("canId") != null){
                        try {
                            request.setAttribute("canId", request.getParameter("canId"));
                            path = visualizarcandidato;
                            router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InstantiationException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalAccessException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }else {
                            //  En caso de no tener canId o conId se volveria a mostrar la lista de candidatos
                        try {
                            path = listarcandidatos;
                            router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                        } catch (ClassNotFoundException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (InstantiationException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        } catch (IllegalAccessException ex) {
                            Logger.getLogger(VisualizarCandidatoAccion.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }else {
                try {
                    path = listarcandidatos;
                    router = as.getFactory().getAction(as.getNombreClaseRecurso(path), servlet.getClass().getClassLoader()).ejecuta(servlet, request, response);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(VisualizarAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(VisualizarAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(VisualizarAlumnoAccion.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return router;
    }
}
